package controller;

import dao.CategoriaJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import model.Area;
import model.Categoria;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import pagecontroller.JsfUtil;
import pagecontroller.PageManager;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class CategoriaController {
    private TreeNode[] selectedNodes;

    public CategoriaController() {
        if (JsfUtil.getObjectFromSession("CategoriaJpaController") == null) {
            jpaController = new CategoriaJpaController();
        } else {
            jpaController = (CategoriaJpaController) JsfUtil.getObjectFromSession("CategoriaJpaController");
        }
    }
    private Categoria categoria = null;
    private Categoria categoriaAux = null;
    private CategoriaJpaController jpaController = null;
    private List<Categoria> categorias = null;
    private TreeNode root;


   public String persiste() {
        if (categoria.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {
            jpaController.edit(this.categoria);
            categoriaAux = categoria;
            this.categoria = null;
            JsfUtil.addSuccessMessage("Categoria Atualizado com Sucesso");
            getPageManager().setPageCategoriaRelat();
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(CategoriaController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(CategoriaController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {
            jpaController.create(categoria);
            categoriaAux = categoria;
            categoria = null;
            JsfUtil.addSuccessMessage("Categoria cadastrado com sucesso.");
            getPageManager().setPageCategoriaRelat();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        Categoria categoriaTemp = (Categoria) JsfUtil.getObjectFromRequestParameter("categoriaTemp");
        this.categoria = categoriaTemp;
        return "refreshPage";
    }

    public String destroy() {
        Categoria categoriaTemp = (Categoria) JsfUtil.getObjectFromRequestParameter("categoria");
        try {
            jpaController.destroy(categoriaTemp.getId());
            JsfUtil.addSuccessMessage("Categoria removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(CategoriaController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }


    private PageManager getPageManager() {
        PageManager pageManager = (PageManager) JsfUtil.getObjectFromSession("PageManager");
        return pageManager;
    }



    public Categoria getCategoria() {
        if (categoria == null) {
            categoria = new Categoria();
        }
        return categoria;
    }

    public List<Categoria> getCategorias(){
        this.categorias = jpaController.findCategoriaEntities();
        return this.categorias;
    }

    public CategoriaJpaController getJpaController() {
        return jpaController;
    }

    public Categoria getCategoriaAux() {
        return categoriaAux;
    }

     

    public TreeNode getRoot() {

        AreaController areaController = (AreaController) JsfUtil.getObjectFromSession("AreaController");
        if(areaController == null){
            areaController = new AreaController();
        }

        root = new DefaultTreeNode("Root", null);

        TreeNode treeNode;
        TreeNode treeNode2;

        for(Area a:areaController.getAreas()){
            treeNode = new DefaultTreeNode(a, root);

            for(Categoria cat:a.getCategorias()){
                treeNode2 = new DefaultTreeNode(cat, treeNode);
            }
        }

        return root;
    }

     public void setSelectedNodes(TreeNode[] selectedNodes) {
        this.selectedNodes = selectedNodes;
    }
     public TreeNode[] getSelectedNodes() {
        return selectedNodes;
    }

}
